package cn.cnsuh.controller.websocket;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

/**
 * 服务端
 * 
 * @author Magic_Ma
 *
 */
@ServerEndpoint("/websocket")
public class ChatRoomServer {

	private boolean firstFlag = true;
	private Session session;
	private String userName;
	// 记录此次聊天室服务有多少个连接
	// key表示此次客户端的session，value代表此次连接对象
	private static final HashMap<String, Object> connectMap = new HashMap<String, Object>();

	// 保存所有用户的昵称信息
	// key是sessionid，value是用户名
	private static final HashMap<String, String> userMap = new HashMap<String, String>();

	// 服务端收到客户端的连接请求，连接成功后会执行此方法
	@OnOpen
	public void start(Session session) {
		System.out.println("connect complete!");
		this.session = session;
		connectMap.put(session.getId(), this);
	}

	@OnMessage
	public void chat(String clientMessage, Session session) {

		ChatRoomServer client = null;
		if (firstFlag) {

			this.userName = clientMessage;

			// 将新进来的用户保存到用户列表
			userMap.put(session.getId(), userName);
			// 发送给公户的提示信息
			String message = htmlMessage("系统消息：", userName + "进入聊天室");
			// 将消息广播给所有的用户
			pushMsg(client, message);
//			for (String connectKey : connectMap.keySet()) {
//				client = (ChatRoomServer) connectMap.get(connectKey);
//				// 给对应的web端发送一个文本信息（message）
//				try {
//					client.session.getBasicRemote().sendText(message);
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}

			firstFlag = false;
		} else {
			String message = htmlMessage(userMap.get(session.getId()), clientMessage);
			pushMsg(client, message);
//			for (String connectKey : connectMap.keySet()) {
//				client = (ChatRoomServer) connectMap.get(connectKey);
//				// 给对应的web端发送一个文本信息（message）
//				try {
//					client.session.getBasicRemote().sendText(message);
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
		}

	}

	// ws.close事件，会触发后台的标注OnClose的方法
	@OnClose
	public void close(Session session) {
		// 当某个用户退出时，对其他用户进行广播
		String message = htmlMessage("系统消息", userMap.get(session.getId()) + "退出了聊天室");

		userMap.remove(session.getId());
		connectMap.remove(session.getId());

		ChatRoomServer client = null;
		pushMsg(client, message);
//		for (String connectKey : connectMap.keySet()) {
//			client = (ChatRoomServer) connectMap.get(connectKey);
//			// 给对应的web端发送一个文本信息（message）
//			try {
//				client.session.getBasicRemote().sendText(message);
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}

	}

	public void pushMsg(ChatRoomServer client, String message) {
		for (String connectKey : connectMap.keySet()) {
			client = (ChatRoomServer) connectMap.get(connectKey);
			// 给对应的web端发送一个文本信息（message）
			try {
				client.session.getBasicRemote().sendText(message);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 拼接返回给客户端的消息
	 * 
	 * @param userName 用户名
	 * @param message  消息
	 * @return
	 */
	public String htmlMessage(String userName, String message) {
		StringBuffer messageBuffer = new StringBuffer();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		messageBuffer.append("<div class='record_item'>");
		messageBuffer.append("<p class='record_item_time'>");
		messageBuffer.append("<span>" + sf.format(new Date()) + "</span>");
		messageBuffer.append("</p>");
		messageBuffer.append("<div class='record_item_txt'>");
		messageBuffer.append("<span class='avatar'>" + userName + "</span>");
		messageBuffer.append("<p>");
		messageBuffer.append("<span class='txt'>" + message + "</span>");
		messageBuffer.append("</p>");
		messageBuffer.append("</div>");
		messageBuffer.append("</div>");
		return messageBuffer.toString();
	}
}
